home *** CD-ROM | disk | FTP | other *** search
- From: wht@n4hgf.uucp (Warren Tucker)
- Newsgroups: comp.sources.misc
- Subject: v16i034: ECU async comm package rev 3.0, Part10/35
- Message-ID: <1991Jan6.052036.27742@sparky.IMD.Sterling.COM>
- Date: 6 Jan 91 05:20:36 GMT
- Approved: kent@sparky.imd.sterling.com
- X-Checksum-Snefru: dbad240a 09d77c6d 607c9ef8 270212b7
-
- Submitted-by: wht@n4hgf.uucp (Warren Tucker)
- Posting-number: Volume 16, Issue 34
- Archive-name: ecu3/part10
-
- ---- Cut Here and feed the following to sh ----
- #!/bin/sh
- # This is part 10 of ecu3
- if touch 2>&1 | fgrep 'amc' > /dev/null
- then TOUCH=touch
- else TOUCH=true
- fi
- # ============= ecuxfer.c ==============
- echo 'x - extracting ecuxfer.c (Text)'
- sed 's/^X//' << 'SHAR_EOF' > 'ecuxfer.c' &&
- X/*+-------------------------------------------------------------------------
- X ecuxfer.c - file transfer
- X wht@n4hgf.Mt-Park.GA.US
- X
- X 000000000011111111112222222222333333333344444444445555555555666666666actually
- X 012345678901234567890123456789012345678901234567890123456789012345678wider
- X00:.--[ Send ZMODEM/CRC32 ]--------------------------------------------.
- X01:| |
- X02:| File? to send: |
- X03:| ................................................................ |
- X04:| |
- X05:| Binary: Y (no CR/LF translation) |
- X06:| Overwrite destination files: Y |
- X07:| Send full pathnames: N |
- X08:| Transfer only newer files: N (if receiver supports) |
- X09:| |
- X-1:| TAB:next ^B:prev END:perform transfer ESC:abort |
- X-0:`-------------------------------------------------------------------'
- X
- X Defined functions:
- X file_xfer_done_bell()
- X file_xfer_start()
- X receive_files_from_remote(argc,argv)
- X report_send_status()
- X send_files_to_remote(argc,argv)
- X xfer_title_fragment()
- X xfrw_bot_msg(msg)
- X xfrw_display_cmd_line()
- X xfrw_get_single(nondelim_list)
- X xfrws_display_allvars()
- X xfrws_display_binary()
- X xfrws_display_literals()
- X xfrws_display_name()
- X xfrws_display_xfernew()
- X
- X--------------------------------------------------------------------------*/
- X/*+:EDITS:*/
- X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
- X
- X#include <curses.h>
- X
- X#define STDIO_H_INCLUDED
- X#define OMIT_TERMIO_REFERENCES
- X#include "ecu.h"
- X#include "ecukey.h"
- X#include "ecuxkey.h"
- X#include "ecuerror.h"
- X#include "pc_scr.h"
- X
- X#define END XFend
- X
- X/* -- protocol xfer types -- */
- X#define ECUSZ_X 1
- X#define ECUSZ_Y 2
- X#define ECUSZ_Z 3
- X#define ECUSEA 4
- X#define CKERMIT 5
- X#define ECURZ_X 7
- X#define ECURZ_Y 8
- X#define ECURZ_Z 9
- X
- X/* --------------------- send window ----------------------------------- */
- X/* SNDW_LINES calculated (xfrw_lines) */
- X#define SNDW_COLS 79
- X#define SNDW_TLY 2
- X/* SNDW_TLX calculated (xfrw_tlx) */
- X
- X#define SNDW_FILE_LY 2
- X#define SNDW_FILE_LX 3
- X#define SNDW_FILE_Y 3
- X#define SNDW_FILE_X 3
- X#define SNDW_FILE_LEN (SNDW_COLS - SNDW_FILE_X - 2)
- X
- X#define SNDW_BIN_Y 5
- X#define SNDW_BIN_LX 3
- X#define SNDW_BIN_X 11
- X#define SNDW_BIN_LX2 13
- X
- X#define SNDW_OVERW_Y 6
- X#define SNDW_OVERW_LX 3
- X#define SNDW_OVERW_X 32
- X
- X#define SNDW_SNDFUL_Y 7
- X#define SNDW_SNDFUL_LX 3
- X#define SNDW_SNDFUL_X 24
- X
- X#define SNDW_XFRNEW_Y 8
- X#define SNDW_XFRNEW_LX 3
- X#define SNDW_XFRNEW_X 30
- X
- X#define SNDW_ZWINDW_Y 9
- X#define SNDW_ZWINDW_LX 3
- X#define SNDW_ZWINDW_X 16
- X#define SNDW_ZWINDW_LEN 6
- X
- Xextern char curr_dir[]; /* current working directory */
- Xextern int protocol_log_packets;
- Xextern int last_child_wait_status;
- X
- Xlong file_xfer_start_time; /* time() value at beginning of file xfer */
- Xchar xfertype = -1; /* file xfer type */
- XWINDOW *xfrw;
- Xchar xfrw_cols;
- Xchar xfrw_lines;
- Xchar xfrw_tlx;
- X
- Xchar p_binary; /* xfer options -- not all apply to all protocols */
- Xchar p_sendfull;
- Xchar p_overwrite;
- Xchar p_xfernew;
- Xchar p_filelist[80];
- Xint zwindw_size;
- X
- X/*+-------------------------------------------------------------------------
- X file_xfer_start()
- X--------------------------------------------------------------------------*/
- Xvoid
- Xfile_xfer_start()
- X{
- X time(&file_xfer_start_time);
- X} /* end of file_xfer_start */
- X
- X/*+-------------------------------------------------------------------------
- X file_xfer_done_bell()
- X--------------------------------------------------------------------------*/
- Xvoid
- Xfile_xfer_done_bell()
- X{
- Xlong time();
- Xlong xfer_time = time((long *)0) - file_xfer_start_time;
- Xint xbell_count = 0;
- Xextern int want_bell_notify;
- X
- X sleep(1);
- X xbell_count = 1;
- X if(xfer_time >= 3600L) /* >= one hour */
- X xbell_count = 3;
- X else if(xfer_time >= 1800L) /* >= 1/2 hour */
- X xbell_count = 2;
- X
- X if(want_bell_notify)
- X bell_notify(XBELL_ATTENTION);
- X
- X xbell(XBELL_DONE,xbell_count);
- X} /* end of file_xfer_done_bell */
- X
- X/*+-------------------------------------------------------------------------
- X xfrw_bot_msg(msg)
- X--------------------------------------------------------------------------*/
- Xvoid
- Xxfrw_bot_msg(msg)
- Xchar *msg;
- X{
- Xregister itmp;
- Xregister itmp2;
- Xstatic last_msglen = 0;
- Xchar msg2[80];
- X
- X wmove(xfrw,xfrw_lines - 1,3);
- X
- X if((itmp = strlen(msg)) == 0)
- X {
- X itmp2 = last_msglen + 2;
- X for(itmp = 0; itmp < itmp2; itmp++)
- X waddch(xfrw,(unsigned)sHR);
- X last_msglen = 0;
- X }
- X else
- X {
- X waddch(xfrw,' ');
- X if(itmp > xfrw_cols - 3 - 2)
- X {
- X strncpy(msg2,msg,xfrw_cols - 3 - 2);
- X msg2[xfrw_cols - 3 - 2 + 1] = 0;
- X waddstr(xfrw,msg2);
- X itmp = strlen(msg2);
- X }
- X else
- X {
- X waddstr(xfrw,msg);
- X itmp = strlen(msg);
- X }
- X waddch(xfrw,' ');
- X if((itmp2 = last_msglen - itmp) > 0)
- X {
- X while(itmp2--)
- X waddch(xfrw,(unsigned)sHR);
- X }
- X last_msglen = itmp; /* remember last message length */
- X }
- X wrefresh(xfrw);
- X} /* end of xfrw_bot_msg */
- X
- X/*+-------------------------------------------------------------------------
- X xfrw_get_single(nondelim_list)
- Xassumes cursor is already positioned
- X--------------------------------------------------------------------------*/
- Xint
- Xxfrw_get_single(nondelim_list)
- Xregister char *nondelim_list;
- X{
- Xregister uint itmp;
- Xstatic char xfrw_nondelim_list[] =
- X{
- X CR,NL,CTL_B,TAB,ESC,CTL_L,CTL_R,END
- X};
- X
- X itmp = winget_single(xfrw,nondelim_list,xfrw_nondelim_list);
- X if( (itmp & 0xFF) == 0x0D)
- X itmp = NL | 0x1000;
- X return(itmp);
- X} /* end of xfrw_get_single */
- X
- X/*+-------------------------------------------------------------------------
- X xfer_title_fragment(xfertype)
- X--------------------------------------------------------------------------*/
- Xchar *
- Xxfer_title_fragment()
- X{
- Xregister char *cptr = "UNKNOWN";
- X
- X switch(xfertype)
- X {
- X case ECURZ_X:
- X case ECUSZ_X: cptr = "XMODEM/CRC"; break;
- X case ECURZ_Y:
- X case ECUSZ_Y: cptr = "YMODEM/CRC"; break;
- X case ECURZ_Z:
- X case ECUSZ_Z: cptr = "ZMODEM/CRC32"; break;
- X case ECUSEA: cptr = "SEAlink"; break;
- X case CKERMIT: cptr = "KERMIT/CRC" ;break;
- X }
- X return(cptr);
- X} /* end of xfer_title_fragment */
- X
- X/*+-------------------------------------------------------------------------
- X xfrw_display_cmd_line()
- X--------------------------------------------------------------------------*/
- Xvoid
- Xxfrw_display_cmd_line()
- X{
- Xregister itmp;
- Xchar *cmd_string = "TAB:next ^B:prev END:perform transfer ESC:abort";
- Xregister left_spaces = ((xfrw_cols - 2) - strlen(cmd_string)) / 2;
- Xint x;
- Xint y;
- X
- X wmove(xfrw,xfrw_lines - 2,1);
- X wstandout(xfrw);
- X for(itmp = 0; itmp < left_spaces; itmp++)
- X waddch(xfrw,' ');
- X waddstr(xfrw,cmd_string);
- X getyx(xfrw,y,x);
- X while(++x < xfrw_cols)
- X waddch(xfrw,' ');
- X wstandend(xfrw);
- X
- X} /* end of xfrw_display_cmd_line */
- X
- X/*+-------------------------------------------------------------------------
- X xfrws_display_literals()
- X--------------------------------------------------------------------------*/
- Xvoid
- Xxfrws_display_literals()
- X{
- X wmove(xfrw,SNDW_FILE_LY,SNDW_FILE_LX);
- X if(xfertype == ECUSZ_X)
- X waddstr(xfrw,"File");
- X else
- X waddstr(xfrw,"File(s)");
- X waddstr(xfrw," to send:");
- X
- X switch(xfertype)
- X {
- X case ECUSZ_Z:
- X wmove(xfrw,SNDW_XFRNEW_Y,SNDW_XFRNEW_LX);
- X waddstr(xfrw,"Transfer only newer files:");
- X wmove(xfrw,SNDW_SNDFUL_Y,SNDW_SNDFUL_LX);
- X waddstr(xfrw,"Send full pathames:");
- X wmove(xfrw,SNDW_ZWINDW_Y,SNDW_ZWINDW_LX);
- X waddstr(xfrw,"Window size:");
- X case CKERMIT:
- X wmove(xfrw,SNDW_OVERW_Y,SNDW_OVERW_LX);
- X waddstr(xfrw,"Overwrite destination files:");
- X case ECUSZ_Y:
- X case ECUSZ_X:
- X wmove(xfrw,SNDW_BIN_Y,SNDW_BIN_LX);
- X waddstr(xfrw,"Binary:");
- X }
- X} /* end of xfrws_display_literals */
- X
- X/*+-------------------------------------------------------------------------
- X xfrws_display_name()
- X--------------------------------------------------------------------------*/
- Xvoid
- Xxfrws_display_name()
- X{
- X clear_area(xfrw,SNDW_FILE_Y,SNDW_FILE_X,SNDW_FILE_LEN);
- X waddstr(xfrw,p_filelist);
- X
- X} /* end of xfrws_display_name */
- X
- X/*+-------------------------------------------------------------------------
- X xfrws_display_binary()
- X--------------------------------------------------------------------------*/
- Xvoid
- Xxfrws_display_binary()
- X{
- X wmove(xfrw,SNDW_BIN_Y,SNDW_BIN_X);
- X waddch(xfrw,(p_binary) ? 'Y' : 'N');
- X if(p_binary)
- X waddstr(xfrw," (no NL-CR/LF translation) ");
- X else
- X waddstr(xfrw," (NL-CR/LF translation enabled)");
- X
- X} /* end of xfrws_display_binary */
- X
- X/*+-------------------------------------------------------------------------
- X xfrws_display_xfernew()
- X--------------------------------------------------------------------------*/
- Xvoid
- Xxfrws_display_xfernew()
- X{
- X wmove(xfrw,SNDW_XFRNEW_Y,SNDW_XFRNEW_X);
- X waddch(xfrw,(p_xfernew) ? 'Y' : 'N');
- X if(p_xfernew)
- X waddstr(xfrw," (if receiver supports)");
- X else
- X waddstr(xfrw," ");
- X} /* end of xfrws_display_xfernew */
- X
- X/*+-------------------------------------------------------------------------
- X xfrws_display_allvars()
- X--------------------------------------------------------------------------*/
- Xvoid
- Xxfrws_display_allvars()
- X{
- Xchar s16[16];
- X
- X xfrws_display_name();
- X switch(xfertype)
- X {
- X case ECUSZ_Z:
- X xfrws_display_xfernew();
- X wmove(xfrw,SNDW_SNDFUL_Y,SNDW_SNDFUL_X);
- X waddch(xfrw,(p_sendfull) ? 'Y' : 'N');
- X wmove(xfrw,SNDW_ZWINDW_Y,SNDW_ZWINDW_X);
- X sprintf(s16,"%d",zwindw_size);
- X waddstr(xfrw,s16);
- X case CKERMIT:
- X wmove(xfrw,SNDW_OVERW_Y,SNDW_OVERW_X);
- X waddch(xfrw,(p_overwrite) ? 'Y' : 'N');
- X case ECUSZ_Y:
- X case ECUSZ_X:
- X xfrws_display_binary();
- X }
- X} /* end of xfrws_display_allvars */
- X
- X/*+-------------------------------------------------------------------------
- X report_send_status() - report file transmission result
- Xreturns proc-type erc
- Xfor "ecu knowledgeable" protocols only
- X--------------------------------------------------------------------------*/
- Xreport_send_status()
- X{
- Xint erc = 0;
- Xunsigned int utmp;
- Xulong colors_at_entry = colors_current;
- Xchar *signal_name_text();
- X
- X utmp = last_child_wait_status;
- X if((utmp & 0xFF) == 0) /* exit() called */
- X {
- X utmp >>= 8;
- X if(utmp == 0)
- X {
- X setcolor(colors_notify);
- X pputs("[transfer successful]");
- X erc = 0;
- X }
- X else if(utmp == 255)
- X {
- X setcolor(colors_error);
- X pputs("[ecu error: transfer program usage error]");
- X erc = eFATAL_ALREADY;
- X }
- X else if(utmp == 254)
- X {
- X setcolor(colors_error);
- X pputs(
- X "[protocol failure: bad line conditions or remote not ready]");
- X erc = eFATAL_ALREADY;
- X }
- X else if(utmp == 253)
- X {
- X setcolor(colors_alert);
- X pputs("[no requested files exist]");
- X erc = eFATAL_ALREADY;
- X }
- X else if(utmp < 128)
- X {
- X setcolor(colors_alert);
- X if(utmp == 127)
- X pputs("[127 or more files skipped]");
- X else
- X pprintf("[%u files rejected]",utmp);
- X erc = 0;
- X }
- X else
- X {
- X setcolor(colors_alert);
- X pprintf("[transfer aborted by %s]",
- X signal_name_text(utmp & 0x7F));
- X erc = eProcAttn_Interrupt;
- X }
- X }
- X else
- X {
- X tcap_curbotleft();
- X setcolor(colors_error);
- X pprintf("[transfer killed by %s]",
- X signal_name_text(utmp & 0x7F));
- X erc = eProcAttn_Interrupt;
- X }
- X
- X setcolor(colors_at_entry);
- X pputs("\n");
- X return(erc);
- X
- X} /* end of report_send_status */
- X
- X/*+-----------------------------------------------------------------------
- X send_files_to_remote(argc,argv)
- X------------------------------------------------------------------------*/
- Xvoid
- Xsend_files_to_remote(argc,argv)
- Xint argc;
- Xchar **argv;
- X{
- Xregister itmp;
- Xregister input_state = 0;
- Xregister input_state_mod;
- Xint input_done;
- Xint used_argv = 0;
- Xchar execcmd[256];
- Xchar s80[80];
- Xchar flst[80];
- Xuchar delim; /* important to be unsigned to avoid sign extension */
- XWINDOW *window_create();
- Xchar bottom_label[64];
- X
- X p_binary = 1; /* assume p_binary xfer */
- X p_sendfull = 0; /* assume no full pathnames */
- X p_overwrite = 1; /* assume overwrite */
- X p_xfernew = 0; /* assume send only newer */
- X p_filelist[0] = 0; /* no filenames yet */
- X#ifdef WHT
- X zwindw_size = 16384; /* my preference */
- X#else
- X zwindw_size = 0; /* assume full streaming sz */
- X#endif
- X
- X switch(to_lower(*(argv[0] + 1)))
- X {
- X case 'x': xfertype = ECUSZ_X; break;
- X case 'y': xfertype = ECUSZ_Y; break;
- X case 'z': xfertype = ECUSZ_Z; break;
- X case 'k': xfertype = CKERMIT; break;
- X case 's': xfertype = ECUSEA; break;
- X default: ff(se,"send command invalid\n");
- X return;
- X }
- X
- X kill_rcvr_process(SIGUSR1); /* SIGUSR1 gives chance to close log file */
- X
- X/* define and open window */
- X input_state_mod = 0;
- X xfrw_tlx = (COLS - SNDW_COLS) / 2;
- X xfrw_cols = SNDW_COLS;
- X switch(xfertype)
- X {
- X case ECUSEA:
- X input_state_mod = 1;
- X xfrw_lines = 7;
- X break;
- X case ECUSZ_X:
- X input_state_mod = 2;
- X xfrw_lines = 9;
- X break;
- X case ECUSZ_Z:
- X input_state_mod = 6;
- X case CKERMIT:
- X if(!input_state_mod)
- X input_state_mod = 3;
- X case ECUSZ_Y:
- X if(!input_state_mod)
- X input_state_mod = 2;
- X xfrw_lines = input_state_mod + 7;
- X break;
- X default:
- X hangup(9999);
- X }
- X
- X windows_start();
- X sprintf(execcmd,"Send %s",xfer_title_fragment());
- X xfrw = window_create(execcmd,-3,SNDW_TLY,(int)xfrw_tlx,
- X (int)xfrw_lines,(int)xfrw_cols);
- X xfrw_display_cmd_line();
- X xfrws_display_literals();
- X xfrws_display_allvars();
- X wmove(xfrw,0,27);
- X waddstr(xfrw," dir: ");
- X if(strlen(curr_dir) > (xfrw_cols - 32))
- X {
- X strncpy(s80,curr_dir,xfrw_cols - 32);
- X s80[xfrw_cols - 32] = 0;
- X waddstr(xfrw,s80);
- X }
- X else
- X waddstr(xfrw,curr_dir);
- X waddch(xfrw,' ');
- X flst[0] = 0;
- X
- XREENTER_INPUT_LOOP:
- X input_done = 0;
- X while(!input_done)
- X {
- X switch(input_state)
- X {
- X case 0: /* filename(s) */
- X xfrw_bot_msg("enter file(s) to send");
- XCASE_0_AGAIN:
- X if(used_argv || (argc == 1))
- X {
- X itmp = wingets(xfrw,SNDW_FILE_Y,SNDW_FILE_X,flst,
- X SNDW_FILE_LEN + 1,&delim,(p_filelist[0] != 0));
- X }
- X else
- X {
- X used_argv = 1;
- X flst[0] = 0;
- X for(itmp = 1; itmp < argc; itmp++)
- X {
- X if((strlen(flst) + strlen(argv[itmp]) + 1) > sizeof(flst))
- X {
- X xfrw_bot_msg("arguments too long ... reenter list");
- X ring_bell();
- X goto CASE_0_AGAIN;
- X }
- X strcat(flst,argv[itmp]);
- X if(itmp != (argc - 1))
- X strcat(flst," ");
- X }
- X delim = NL;
- X }
- X if(delim == ESC)
- X break;
- X if(strlen(flst))
- X {
- X strcpy(p_filelist,flst);
- X xfrws_display_name();
- X if(find_shell_chars(p_filelist))
- X {
- X char *expcmd;
- X
- X if(expand_cmd_with_wildlist(p_filelist,&expcmd))
- X {
- X xfrw_bot_msg(expcmd);
- X ring_bell();
- X goto CASE_0_AGAIN;
- X }
- X expcmd[SNDW_FILE_LEN - 1] = 0;
- X clear_area(xfrw,SNDW_FILE_Y,SNDW_FILE_X,SNDW_FILE_LEN);
- X waddstr(xfrw,expcmd);
- X free(expcmd);
- X }
- X }
- X break;
- X
- X case 1: /* binary */
- X xfrw_bot_msg("Y: no conversion, N: NLs converted to CR/LF");
- X wmove(xfrw,SNDW_BIN_Y,SNDW_BIN_X);
- X wrefresh(xfrw);
- X delim = NL;
- X switch(itmp = xfrw_get_single("ny"))
- X {
- X case 0:
- X case 1:
- X p_binary = itmp;
- X xfrws_display_binary();
- X break;
- X default:
- X delim = itmp & 0xFF;
- X break;
- X }
- X break;
- X
- X case 2: /* overwrite */
- X xfrw_bot_msg("Y: overwrite, N: protect destination files");
- X wmove(xfrw,SNDW_OVERW_Y,SNDW_OVERW_X);
- X wrefresh(xfrw);
- X delim = NL;
- X switch(itmp = xfrw_get_single("ny"))
- X {
- X case 0:
- X case 1:
- X p_overwrite = itmp;
- X break;
- X default:
- X delim = itmp & 0xFF;
- X break;
- X }
- X break;
- X
- X case 3: /* send full pathnames */
- X xfrw_bot_msg(
- X "Y: full pathnames, N: strip directory portion from names");
- X wmove(xfrw,SNDW_SNDFUL_Y,SNDW_SNDFUL_X);
- X wrefresh(xfrw);
- X delim = NL;
- X switch(itmp = xfrw_get_single("ny"))
- X {
- X case 0:
- X case 1:
- X p_sendfull = itmp;
- X break;
- X default:
- X delim = itmp & 0xFF;
- X break;
- X }
- X break;
- X
- X case 4: /* src newer than dest */
- X
- X xfrw_bot_msg(
- X "Y: send only if source newer than destination, N send all");
- X wmove(xfrw,SNDW_XFRNEW_Y,SNDW_XFRNEW_X);
- X wrefresh(xfrw);
- X delim = NL;
- X switch(itmp = xfrw_get_single("ny"))
- X {
- X case 0:
- X case 1:
- X p_xfernew = itmp;
- X xfrws_display_xfernew();
- X break;
- X default:
- X delim = itmp & 0xFF;
- X break;
- X }
- X break;
- X
- X case 5: /* window size */
- X
- X xfrw_bot_msg(
- X "window size (max bytes sent before ACK required) 0 = stream");
- XCASE_5_AGAIN:
- X sprintf(s80,"%d",zwindw_size);
- X clear_area(xfrw,SNDW_ZWINDW_Y,SNDW_ZWINDW_X,
- X SNDW_ZWINDW_LEN + 10);
- X itmp = wingets(xfrw,SNDW_ZWINDW_Y,SNDW_ZWINDW_X,s80,
- X SNDW_ZWINDW_LEN + 1,&delim,1);
- X if((delim == ESC))
- X break;
- X if( ((itmp = atoi(s80)) != 0) &&
- X ((itmp < 256) || (itmp > 65536)))
- X {
- X ring_bell();
- X xfrw_bot_msg(
- X "window size must be 0 or 256 <= w <= 65536");
- X goto CASE_5_AGAIN;
- X }
- X zwindw_size = (itmp / 64) * 64;
- X sprintf(s80,"%d%s",zwindw_size,
- X (zwindw_size != itmp) ? " adjusted" : "" );
- X clear_area(xfrw,SNDW_ZWINDW_Y,SNDW_ZWINDW_X,
- X SNDW_ZWINDW_LEN + 10);
- X waddstr(xfrw,s80);
- X break;
- X }
- X
- X switch(delim)
- X {
- X case CTL_B:
- X input_state = (input_state) ? input_state - 1
- X : input_state_mod - 1;
- X break;
- X
- X case TAB:
- X case NL:
- X input_state++;
- X input_state %= input_state_mod;
- X break;
- X
- X case CTL_L:
- X case CTL_R:
- X tcap_clear_screen();
- X touchwin(stdscr);
- X wrefresh(stdscr);
- X touchwin(xfrw);
- X wrefresh(xfrw);
- X break;
- X
- X case ESC:
- X xfrw_bot_msg("transfer abandoned");
- X input_done = 1;
- X break;
- X
- X case END:
- X input_done = 1;
- X break;
- X }
- X }
- X
- X if(delim == END)
- X {
- X if(!p_filelist[0])
- X {
- X ring_bell();
- X xfrw_bot_msg("No filenames entered! Press <ENTER>");
- X (void)ttygetc(1);
- X input_state = 0;
- X goto REENTER_INPUT_LOOP;
- X }
- X xfrw_bot_msg("starting file transfer");
- X }
- X
- X windows_end(xfrw);
- X tcap_cursor(SNDW_TLY + xfrw_lines + 1,0);
- X
- X if(delim == ESC)
- X {
- X start_rcvr_process(1);
- X return;
- X }
- X
- X bottom_label[0] = 0;
- X if(shm->Llogical[0])
- X sprintf(bottom_label,"-C \"'Connected to %s'\" ",shm->Llogical);
- X
- X/* we are going to do a transfer! */
- X switch(xfertype)
- X {
- X case ECUSZ_X:
- X sprintf(execcmd,"ecusz -X -. %d ",shm->Liofd);
- X strcat(execcmd,bottom_label);
- X if(protocol_log_packets)
- X strcat(execcmd,"-, ");
- X if(p_binary)
- X strcat(execcmd,"-b ");
- X else
- X strcat(execcmd,"-a ");
- X strcat(execcmd,p_filelist);
- X break;
- X case ECUSZ_Y:
- X sprintf(execcmd,"ecusz -Y -. %d -k ",shm->Liofd);
- X strcat(execcmd,bottom_label);
- X if(protocol_log_packets)
- X strcat(execcmd,"-, ");
- X if(p_binary)
- X strcat(execcmd,"-b ");
- X else
- X strcat(execcmd,"-a ");
- X strcat(execcmd,p_filelist);
- X break;
- X
- X case ECUSZ_Z:
- X sprintf(execcmd,"ecusz -Z -. %d ",shm->Liofd);
- X strcat(execcmd,bottom_label);
- X if(zwindw_size)
- X sprintf(&execcmd[strlen(execcmd)]," -w %d ",zwindw_size);
- X if(protocol_log_packets)
- X strcat(execcmd,"-, ");
- X if(p_overwrite)
- X strcat(execcmd,"-y ");
- X else
- X strcat(execcmd,"-p ");
- X if(p_binary)
- X strcat(execcmd,"-b ");
- X else
- X strcat(execcmd,"-a ");
- X if(p_xfernew)
- X strcat(execcmd,"-n "); /* overrides -y/-p choice earlier */
- X if(p_sendfull)
- X strcat(execcmd,"-f ");
- X strcat(execcmd,p_filelist);
- X break;
- X
- X case ECUSEA:
- X sprintf(execcmd,"ecusea -. %d -/ %s -s ",shm->Liofd,curr_dir);
- X if(protocol_log_packets)
- X strcat(execcmd,"-, ");
- X strcat(execcmd,p_filelist);
- X break;
- X
- X case CKERMIT:
- X sprintf(execcmd,"ckermit -l %d -b %u -p %c%s%s -s %s",
- X shm->Liofd,
- X shm->Lbaud,
- X (shm->Lparity) ? shm->Lparity : 'n',
- X (p_binary) ? " -i" : "",
- X (p_overwrite) ? "" : " -w",
- X p_filelist);
- X break;
- X
- X }
- X
- X file_xfer_start();
- X
- X if(find_shell_chars(execcmd))
- X {
- X char *expcmd;
- X
- X if(expand_cmd_with_wildlist(execcmd,&expcmd))
- X {
- X ff(se,"No files match\r\n");
- X return;
- X }
- X exec_cmd(expcmd);
- X free(expcmd);
- X }
- X else
- X {
- X exec_cmd(execcmd);
- X ff(se,"wierd 2\r\n");
- X }
- X
- X lreset_ksr();
- X
- X switch(xfertype)
- X {
- X case ECUSEA:
- X case ECUSZ_X:
- X case ECUSZ_Y:
- X case ECUSZ_Z:
- X xfertype = 1; /* was ecusz */
- X break;
- X default:
- X xfertype = 0;
- X break;
- X }
- X
- X if(xfertype) /* ecu knowledgable */
- X report_send_status();
- X else
- X {
- X tcap_stand_out();
- X ff(se," transfer status %04x ",last_child_wait_status);
- X tcap_stand_end();
- X ff(se,"\r\n");
- X }
- X
- X ff(se,"\r\n");
- X
- X file_xfer_done_bell();
- X start_rcvr_process(1);
- X} /* end of send_files_to_remote */
- X
- X/*+-------------------------------------------------------------------------
- X receive_files_from_remote(argc,argv)
- X--------------------------------------------------------------------------*/
- Xvoid
- Xreceive_files_from_remote(argc,argv)
- Xint argc;
- Xchar **argv;
- X{
- Xregister itmp;
- Xchar execcmd[256];
- Xint xfertype;
- Xchar bottom_label[64];
- X
- X sprintf(bottom_label,"-C 'Connected to %s' ",
- X (shm->Llogical[0]) ? shm->Llogical : "?");
- X
- X switch(to_lower(*(argv[0] + 1)))
- X {
- X case 'k': xfertype = CKERMIT; break;
- X case 's': xfertype = ECUSEA; break;
- X case 'x': xfertype = ECURZ_X; break;
- X case 'y': xfertype = ECURZ_Y; break;
- X case 'z': xfertype = ECURZ_Z; break;
- X default: ff(se,"receive command invalid\n");
- X return;
- X }
- X
- X if(xfertype == ECURZ_X)
- X {
- X char xfilenam[128];
- X kill_rcvr_process(SIGUSR1);
- X sprintf(execcmd,"ecurz -X -. %d -c ",shm->Liofd);
- X strcat(execcmd,bottom_label);
- X if(protocol_log_packets)
- X strcat(execcmd,"-, ");
- X
- X ff(se," File name to receive via XMODEM/CRC: ");
- X ttygets(xfilenam,sizeof(xfilenam),1);
- X if( (xfilenam[0] == ESC) || !strlen(xfilenam))
- X {
- X ff(se,"transfer abandoned\r\n");
- X start_rcvr_process(1);
- X return;
- X }
- X /* get xmodem ascii or binary */
- X ff(se,"Translate CR/LF to NL (y,n)? ");
- X switch(itmp = to_lower(ttygetc(0)))
- X {
- X case 'y': strcat(execcmd,"-a "); break;
- X case 'n': strcat(execcmd,"-b "); break;
- X default:
- X ff(se,"transfer abandoned\r\n");
- X start_rcvr_process(1);
- X return;
- X }
- X ff(se,"%s\r\n",(itmp == 'y') ? "yes" : "no");
- X strcat(execcmd,xfilenam);
- X file_xfer_start();
- X exec_cmd(execcmd);
- X }
- X else if(xfertype == ECURZ_Y)
- X {
- X ff(se,"\r\n");
- X kill_rcvr_process(SIGUSR1);
- X sprintf(execcmd,"ecurz -Y -. %d -y ",shm->Liofd);
- X strcat(execcmd,bottom_label);
- X if(protocol_log_packets)
- X strcat(execcmd,"-, ");
- X file_xfer_start();
- X exec_cmd(execcmd);
- X }
- X else if(xfertype == ECURZ_Z)
- X {
- X ff(se,"\r\n");
- X kill_rcvr_process(SIGUSR1);
- X sprintf(execcmd,"ecurz -Z -. %d ",shm->Liofd);
- X if(protocol_log_packets)
- X strcat(execcmd,"-, ");
- X strcat(execcmd,bottom_label);
- X file_xfer_start();
- X exec_cmd(execcmd);
- X }
- X else if(xfertype == CKERMIT)
- X {
- X kill_rcvr_process(SIGUSR1);
- X sprintf(execcmd,"ckermit -r -e 512 -l %d -b %d -p %c",
- X shm->Liofd,shm->Lbaud,(shm->Lparity) ? shm->Lparity : 'n');
- X ff(se," Translate CR/LF to NL (y,n)? ");
- X switch(itmp = to_lower(ttygetc(0)))
- X {
- X case 'y': strcat(execcmd," -i"); break;
- X case 'n': break;
- X default:
- X ff(se,"transfer abandoned\r\n");
- X start_rcvr_process(1);
- X return;
- X }
- X ff(se,"%s\r\n",(itmp == 'a') ? "yes" : "no");
- X file_xfer_start();
- X exec_cmd(execcmd);
- X }
- X else if(xfertype == ECUSEA)
- X {
- X kill_rcvr_process(SIGUSR1);
- X sprintf(execcmd,"ecusea -r -. %d -/ %s",shm->Liofd,curr_dir);
- X if(protocol_log_packets)
- X strcat(execcmd," -,");
- X file_xfer_start();
- X exec_cmd(execcmd);
- X }
- X lreset_ksr();
- X file_xfer_done_bell();
- X nap(20L);
- X start_rcvr_process(1);
- X} /* end of receive_files_from_remote */
- X/* end of ecuxfer.c */
- X/* vi: set tabstop=4 shiftwidth=4: */
- SHAR_EOF
- $TOUCH -am 1224223790 'ecuxfer.c' &&
- chmod 0644 ecuxfer.c ||
- echo 'restore of ecuxfer.c failed'
- Wc_c="`wc -c < 'ecuxfer.c'`"
- test 23483 -eq "$Wc_c" ||
- echo 'ecuxfer.c: original size 23483, current size' "$Wc_c"
- # ============= esdutil.c ==============
- echo 'x - extracting esdutil.c (Text)'
- sed 's/^X//' << 'SHAR_EOF' > 'esdutil.c' &&
- X/*+----------------------------------------------------------------
- X esdutil.c - ecu extended string descriptor manipulation
- X wht@n4hgf.Mt-Park.GA.US
- X
- X Defined functions:
- X append_zstr_to_esd(param,zstr)
- X end_of_cmd(param)
- X esdstrindex(esd1,esd2,index1_flag,index2_flag)
- X fgetesd(param,fileptr)
- X fputesd(param,fileptr,index_flag,nl_flag)
- X free_esd(tesd)
- X get_alpha_zstr(param,strbuf,strbuf_maxcb)
- X get_alphanum_zstr(param,strbuf,strbuf_maxcb)
- X get_cmd_char(param,pchar)
- X get_numeric_value(param,value)
- X get_numeric_zstr(param,strbuf,strbuf_maxcb)
- X get_switches(param,switches,switches_max)
- X get_word_zstr(param,strbuf,strbuf_maxcb)
- X init_esd(tesd,cptr,maxcb)
- X keyword_lookup(ktable,param)
- X make_esd(maxcb)
- X null_terminate_esd(tesd)
- X realloc_esd(tesd,maxcb)
- X show_esd(tesd,title)
- X skip_cmd_break(param)
- X skip_cmd_char(param,skipchar)
- X skip_colon(param)
- X skip_comma(param)
- X skip_paren(param,fLeft)
- X strindex(str1,str2)
- X strip_trailing_spaces_esd(ztext)
- X zero_esd(tesd)
- X
- XThis is old code; give me a break
- X-----------------------------------------------------------------*/
- X/*+:EDITS:*/
- X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */
- X
- X#include <ctype.h>
- X#include "ecu.h"
- X#include "ecuerror.h"
- X#include "esd.h"
- X
- Xextern int errno;
- X
- X/*+-------------------------------------------------------------------------
- X null_terminate_esd(&esd)
- X puts null at 'cb' position of string (standard esd always
- X has one more byte in buffer than maxcb says)
- X--------------------------------------------------------------------------*/
- Xvoid
- Xnull_terminate_esd(tesd)
- Xregister ESD *tesd;
- X{
- X tesd->pb[tesd->cb] = 0;
- X} /* end of null_terminate_esd */
- X
- X/*+-----------------------------------------------------------------------
- X zero_esd(tesd) zero an esd
- X------------------------------------------------------------------------*/
- Xvoid
- Xzero_esd(tesd)
- Xregister ESD *tesd;
- X{
- X tesd->cb = 0; /* current count == 0 */
- X tesd->index = 0; /* parse index to first position */
- X tesd->old_index = 0; /* parse index to first position */
- X *tesd->pb = 0; /* start with null terminated string */
- X
- X} /* end of zero_esd */
- X
- X/*+-----------------------------------------------------------------------
- X init_esd(tesd,cptr,maxcb) init an esd
- X------------------------------------------------------------------------*/
- Xvoid
- Xinit_esd(tesd,cptr,maxcb)
- Xregister ESD *tesd;
- Xchar *cptr;
- Xregister maxcb;
- X{
- X tesd->pb = cptr; /* pointer to string */
- X tesd->maxcb = maxcb; /* max characters in buffer */
- X zero_esd(tesd);
- X
- X} /* end of init_esd */
- X
- X/*+-----------------------------------------------------------------------
- X esdptr = make_esd(maxcb) allocate an esd and buffer
- X------------------------------------------------------------------------*/
- XESD *
- Xmake_esd(maxcb)
- Xregister maxcb; /* desired maxcb */
- X{
- Xregister ESD *tesd;
- Xregister actual_cb;
- X
- X /* we get an extra character to ensure room for null past maxcb */
- X actual_cb = maxcb + 1;
- X if(actual_cb & 1) /* even allocation */
- X ++actual_cb;
- X
- X if(!(tesd = (ESD *)malloc(sizeof(ESD))))
- X return((ESD *)0); /* return NULL if failure */
- X
- X if(!(tesd->pb = malloc(actual_cb)))
- X {
- X free((char *)tesd);
- X return((ESD *)0); /* return NULL if failure */
- X }
- X
- X init_esd(tesd,tesd->pb,maxcb);
- X return(tesd);
- X
- X} /* end of make_esd */
- X
- X/*+-----------------------------------------------------------------------
- X esdptr = realloc_esd(maxcb) - realloc an esd buffer
- X------------------------------------------------------------------------*/
- Xint
- Xrealloc_esd(tesd,maxcb)
- XESD *tesd;
- Xregister maxcb; /* desired maxcb */
- X{
- Xregister actual_cb;
- X
- X if(!tesd)
- X return(eInternalLogicError);
- X
- X /* we get an extra character to ensure room for null past maxcb */
- X actual_cb = maxcb + 1;
- X if(actual_cb & 1) /* even allocation */
- X ++actual_cb;
- X
- X if(!(tesd->pb = realloc(tesd->pb,actual_cb)))
- X {
- X errno = ENOMEM;
- X ff(se,"\r\n\r\nMEMORY REALLOC FAILED. FATAL ERROR. SORRY.\r\n");
- X hangup(HANGUP_XMTR_LOGIC_ERROR);
- X }
- X
- X return(0);
- X
- X} /* end of realloc_esd */
- X
- X/*+-----------------------------------------------------------------------
- X free_esd(esdptr)
- X------------------------------------------------------------------------*/
- Xvoid
- Xfree_esd(tesd)
- Xregister ESD *tesd;
- X{
- X if(tesd && tesd->pb)
- X {
- X free(tesd->pb);
- X free((char *)tesd);
- X }
- X else
- X {
- X errno = ENOMEM;
- X ff(se,"\r\n\r\nFREE_ESD FAILED. FATAL ERROR. SORRY.\r\n");
- X hangup(HANGUP_XMTR_LOGIC_ERROR);
- X }
- X}
- X
- X/*+-------------------------------------------------------------------------
- X show_esd(tesd,title)
- X--------------------------------------------------------------------------*/
- Xvoid
- Xshow_esd(tesd,title)
- XESD *tesd;
- Xchar *title;
- X{
- Xregister itmp;
- X
- X if(title && *title)
- X {
- X pputs(title);
- X pputs("\n");
- X }
- X null_terminate_esd(tesd);
- X pputs(tesd->pb);
- X pputs("\n");
- X for(itmp = 0; itmp <= tesd->cb; itmp++)
- X {
- X if(itmp == tesd->old_index)
- X pputc('^');
- X else if(itmp == tesd->index)
- X pputc('^');
- X else
- X pputc(' ');
- X if((itmp > tesd->old_index) && (itmp > tesd->index))
- X break;
- X }
- X pprintf(" o%d i%d c%d\n",tesd->old_index,tesd->index,tesd->cb);
- X
- X} /* end of show_esd */
- X
- X/*+----------------------------------------------------------------
- X strindex: string index function
- X
- X Returns position of 'str2' in 'str1' if found
- X If 'str2' is null, then 0 is returned (null matches anything)
- X Returns -1 if not found
- X-----------------------------------------------------------------*/
- Xint
- Xstrindex(str1,str2)
- Xchar *str1; /* the (target) string to search */
- Xchar *str2; /* the (comparand) string to search for */
- X{
- Xregister istr1 = 0;
- Xregister lstr2 = strlen(str2);
- Xregister char *mstr = str1; /* the (target) string to search */
- X
- X if(*str2 == 0) /* null string matches anything */
- X return(0);
- X
- X while(*mstr)
- X {
- X if(*mstr == *str2)
- X { /* we have a first char match... does rest of string match? */
- X if(!strncmp(mstr,str2,lstr2))
- X return(istr1); /* if so, return match position */
- X }
- X mstr++;
- X istr1++;
- X }
- X
- X return(-1); /* if we exhaust target string, flunk */
- X
- X} /* end of strindex */
- X
- X/*+-------------------------------------------------------------------------
- X esdstrindex(esd1,esd2,index1_flag,index2_flag)
- X
- X Call strindex with esd1->pb and esd2->pb.
- X If index1_flag != 0, esd1->pb + esd1->index passed
- X If index2_flag != 0, esd2->pb + esd2->index passed
- X--------------------------------------------------------------------------*/
- Xesdstrindex(esd1,esd2,index1_flag,index2_flag)
- Xregister ESD *esd1;
- Xregister ESD *esd2;
- Xregister index1_flag;
- Xregister index2_flag;
- X{
- X return(strindex((index1_flag) ? esd1->pb : esd1->pb + esd1->index,
- X (index2_flag) ? esd2->pb : esd2->pb + esd2->index));
- X
- X} /* end of esdstrindex */
- X
- X/*+----------------------------------------------------------------
- X keyword_lookup(ktable,param)
- X
- X Lookup string in keyword_table struct array
- X Returns table->key_token if 'param' found in
- X 'table', else -1
- X
- X Beware substrings. "type","typedef" will both match "type"
- X-----------------------------------------------------------------*/
- Xkeyword_lookup(ktable,param)
- Xregister KEYTAB *ktable;
- Xregister char *param;
- X{
- X/* register plen = strlen(param); */
- X
- X while(ktable->key_word)
- X {
- X/* if(!strncmp(ktable->key_word,param,plen)) */
- X if(!strcmp(ktable->key_word,param))
- X return(ktable->key_token);
- X ++ktable;
- X } /* end of while */
- X
- X return(-1); /* search failed */
- X
- X} /* end of keyword_lookup */
- X
- X/*+----------------------------------------------------------------
- X skip_cmd_break(param)
- X
- X Finds next non-break
- X
- X 'param' is an esd with valid 'index' field
- X Returns 0 index field points to non-break character
- X eNoParameter end of command found
- X-----------------------------------------------------------------*/
- Xint
- Xskip_cmd_break(param)
- Xregister ESD *param;
- X{
- Xregister cb = param->cb;
- Xregister index = param->index;
- Xregister char *pb = param->pb;
- X
- X while(index < cb)
- X {
- X if(!isspace(*(pb + index)))
- X break;
- X index++;
- X }
- X param->old_index = param->index = index;
- X if(index >= cb)
- X return(eNoParameter);
- X return(0);
- X
- X} /* end of skip_cmd_break */
- X
- X/*+-------------------------------------------------------------------------
- X end_of_cmd(param) - return 1 if at end of command
- X--------------------------------------------------------------------------*/
- Xint
- Xend_of_cmd(param)
- Xregister ESD *param;
- X{
- X if(skip_cmd_break(param) || (*(param->pb + param->index) == ';') ||
- X (*(param->pb + param->index) == '#'))
- X return(1);
- X return(0);
- X} /* end of end_of_cmd */
- X
- X/*+-------------------------------------------------------------------------
- X erc = skip_cmd_char(param,skipchar)
- X--------------------------------------------------------------------------*/
- Xint
- Xskip_cmd_char(param,skipchar)
- Xregister ESD *param;
- Xregister char skipchar;
- X{
- Xint erc;
- X
- X if(erc = skip_cmd_break(param))
- X return(erc);
- X
- X if(param->pb[param->index] == skipchar)
- X {
- X ++param->index;
- X return(0);
- X }
- X
- X return(eSyntaxError);
- X
- X} /* end of skip_cmd_char */
- X
- X/*+-------------------------------------------------------------------------
- X erc = skip_colon(param)
- X--------------------------------------------------------------------------*/
- Xint
- Xskip_colon(param)
- Xregister ESD *param;
- X{
- X register erc;
- X
- X if(erc = skip_cmd_break(param))
- X return(erc);
- X
- X if(param->pb[param->index] == ':')
- X {
- X ++param->index;
- X return(0);
- X }
- X
- X return(eCommaExpected);
- X
- X} /* end of skip_colon */
- X
- X/*+-------------------------------------------------------------------------
- X erc = skip_comma(param)
- X--------------------------------------------------------------------------*/
- Xint
- Xskip_comma(param)
- Xregister ESD *param;
- X{
- X register erc;
- X
- X if(erc = skip_cmd_break(param))
- X return(erc);
- X
- X if(param->pb[param->index] == ',')
- X {
- X ++param->index;
- X return(0);
- X }
- X
- X return(eCommaExpected);
- X
- X} /* end of skip_comma */
- X
- X/*+-------------------------------------------------------------------------
- X erc = skip_paren(fparam,LEFT or RIGHT)
- X--------------------------------------------------------------------------*/
- Xint
- Xskip_paren(param,fLeft)
- Xregister ESD *param;
- Xint fLeft;
- X{
- Xregister erc;
- Xregister char search = (fLeft) ? '(' : ')';
- X
- X if(erc = skip_cmd_break(param))
- X return(erc);
- X
- X if(param->pb[param->index] == search)
- X {
- X param->index++;
- X return(0);
- X }
- X return((fLeft) ? eMissingLeftParen : eMissingRightParen);
- X
- X} /* end of skip_paren */
- X
- X/*+-------------------------------------------------------------------------
- X get_cmd_char(param,pchar)
- X--------------------------------------------------------------------------*/
- Xint
- Xget_cmd_char(param,pchar)
- Xregister ESD *param;
- Xchar *pchar;
- X{
- Xint erc;
- X
- X if(erc = skip_cmd_break(param))
- X return(erc);
- X *pchar = param->pb[param->index++];
- X return(0);
- X
- X} /* end of get_cmd_char */
- X
- X/*+----------------------------------------------------------------
- X get_alpha_zstr(&esd,&strbuf,strbuf_maxcb)
- X
- X places next alphabetic string token [A-Za-z_] into
- X the null-terminated 'strbuf' string. returns 0 or -1
- X or skip_cmd_break error codes
- X-----------------------------------------------------------------*/
- Xint
- Xget_alpha_zstr(param,strbuf,strbuf_maxcb)
- XESD *param;
- Xregister char *strbuf;
- Xint strbuf_maxcb;
- X{
- Xregister izstr;
- Xregister schar;
- Xregister char *pb = param->pb;
- X
- X if(izstr = skip_cmd_break(param))
- X return(izstr);
- X izstr = 0;
- X while( (izstr < strbuf_maxcb-1) && (param->index < param->cb) )
- X {
- X schar = pb[param->index];
- X if((!isalpha(schar)) && (schar != '_'))
- X break;
- X strbuf[izstr++] = schar;
- X param->index++;
- X }
- X
- X strbuf[izstr] = 0;
- X return(izstr ? 0 : eBadParameter);
- X
- X} /* end of get_alpha_zstr */
- X
- X/*+----------------------------------------------------------------
- X get_alphanum_zstr(&esd,&strbuf,strbuf_maxcb)
- X
- X places next alphanumeric string token [A-Za-z0-9_]
- X into the null-terminated 'strbuf' string. returns 0
- X or -1 or skip_cmd_break error codes
- X-----------------------------------------------------------------*/
- Xint
- Xget_alphanum_zstr(param,strbuf,strbuf_maxcb)
- Xregister ESD *param;
- Xregister char *strbuf;
- Xint strbuf_maxcb;
- X{
- Xint izstr = 0;
- Xint schar;
- Xregister cb = param->cb;
- Xregister index;
- X
- X if(izstr = skip_cmd_break(param))
- X return(izstr);
- X
- X index = param->index;
- X while( (izstr < strbuf_maxcb-1) && (index < cb))
- X {
- X schar = param->pb[index++];
- X if(isalnum(schar) || (schar == '_'))
- X strbuf[izstr++] = schar;
- X else
- X {
- X --index;
- X break;
- X }
- X }
- X
- X param->index = index;
- X strbuf[izstr]=0;
- X return(izstr ? 0 : eBadParameter);
- X
- X} /* end of get_alphanum_zstr */
- X
- X/*+----------------------------------------------------------------
- X get_numeric_zstr(&esd,&strbuf,strbuf_maxcb)
- X gets next numeric string token places it
- X into the null-terminated 'strbuf' string. returns 0 or -1
- X or skip_cmd_break error codes
- X-----------------------------------------------------------------*/
- Xint
- Xget_numeric_zstr(param,strbuf,strbuf_maxcb)
- Xregister ESD *param;
- Xregister char *strbuf;
- Xregister strbuf_maxcb;
- X{
- X register izstr;
- X register schar;
- X
- X if(izstr = skip_cmd_break(param))
- X return(izstr);
- X
- X while( (izstr < strbuf_maxcb-1) && (param->index < param->cb) )
- X {
- X schar = param->pb[param->index++];
- X if( isdigit(schar) )
- X strbuf[izstr++]=schar;
- X else
- X {
- X --param->index;
- X break;
- X }
- X }
- X
- X strbuf[izstr]=0;
- X return(izstr ? 0 : eBadParameter);
- X
- X} /* end of get_numeric_zstr */
- X
- X/*+-----------------------------------------------------------------------
- X get_numeric_value(param,&long_var)
- X------------------------------------------------------------------------*/
- Xget_numeric_value(param,value)
- Xregister ESD *param;
- Xregister long *value;
- X{
- Xregister erc;
- Xchar buf[32];
- X
- X if(erc = get_numeric_zstr(param,buf,sizeof(buf)))
- X return(erc);
- X sscanf(buf,"%ld",value);
- X return(0);
- X
- X} /* end of get_numeric_value */
- X
- X/*+----------------------------------------------------------------
- X get_word_zstr(&esd,&strbuf,strbuf_maxcb)
- X
- X gets next word (continuous string of characters without spaces
- X or tabs) returns 0 or -1 or skip_cmd_break error codes
- X-----------------------------------------------------------------*/
- Xint
- Xget_word_zstr(param,strbuf,strbuf_maxcb)
- Xregister ESD *param;
- Xregister char *strbuf;
- Xregister strbuf_maxcb;
- X{
- X register izstr;
- X register schar;
- X
- X if(izstr = skip_cmd_break(param))
- X return(izstr);
- X
- X strbuf_maxcb--;
- X while((izstr < strbuf_maxcb) && (param->index < param->cb))
- X {
- X schar = param->pb[param->index++];
- X if( (schar > 0x20) && (schar <= 0x7e))
- X strbuf[izstr++]=schar;
- X else
- X {
- X --param->index;
- X break;
- X }
- X }
- X
- X strbuf[izstr]=0;
- X return(izstr ? 0 : eBadParameter);
- X
- X} /* end of get_word_zstr */
- X
- X/*+-------------------------------------------------------------------------
- X strip_trailing_spaces_esd(param)
- X--------------------------------------------------------------------------*/
- Xvoid
- Xstrip_trailing_spaces_esd(ztext)
- Xregister ESD *ztext;
- X{
- X while(ztext->cb &&
- X ((ztext->pb[ztext->cb-1] == 0x20) || (ztext->pb[ztext->cb-1] == 0x20)))
- X {
- X ztext->cb--;
- X }
- X} /* end of strip_trailing_spaces_esd */
- X
- X/*+-------------------------------------------------------------------------
- X fgetesd(&esd,fileptr)
- X
- X stdio read from FILE *fileptr into esd
- X returns param->cb set up not including trailing nl, param->index == 0
- X--------------------------------------------------------------------------*/
- Xint
- Xfgetesd(param,fileptr)
- Xregister ESD *param;
- Xregister FILE *fileptr;
- X{
- Xregister char *cptr;
- X
- X if(fgets(param->pb,param->maxcb,fileptr) == NULL)
- X return(eEOF);
- X if((cptr = strchr(param->pb,0x0A)) == NULL)
- X return(eBufferTooSmall);
- X param->cb = (int)(cptr - param->pb);
- X null_terminate_esd(param);
- X param->index = 0;
- X param->old_index = 0;
- X return(0);
- X
- X} /* end of fgetesd */
- X
- X/*+-------------------------------------------------------------------------
- X fputesd(&esd,fileptr,index_flag,nl_flag)
- X
- X write esd contents to stdio FILE *fileptr
- X if index_flag is true, write from param->index thru end of esd
- X otherwise, from start of esd
- X if nl_flag is true, append nl to write, else just esd contents
- X--------------------------------------------------------------------------*/
- Xint
- Xfputesd(param,fileptr,index_flag,nl_flag)
- Xregister ESD *param;
- XFILE *fileptr;
- Xint index_flag;
- Xint nl_flag;
- X{
- Xregister char *cptr;
- Xregister write_length;
- X
- X if(index_flag)
- X {
- X cptr = ¶m->pb[param->index];
- X write_length = param->cb - param->index;
- X }
- X else
- X {
- X cptr = param->pb;
- X write_length = param->cb;
- X }
- X
- X if(write_length)
- X fwrite(cptr,write_length,1,fileptr);
- X
- X if(nl_flag)
- X fputc(0x0A,fileptr);
- X
- X return(0);
- X} /* end of fputesd */
- X
- X/*+-----------------------------------------------------------------
- X append_zstr_to_esd(param,zstr)
- X------------------------------------------------------------------*/
- Xappend_zstr_to_esd(param,zstr)
- XESD *param;
- Xchar *zstr;
- X{
- Xregister zstrlen = strlen(zstr);
- Xregister erc = 0;
- X
- X if(zstrlen > (param->maxcb - param->cb))
- X {
- X zstrlen = param->maxcb - param->cb;
- X erc = eBufferTooSmall;
- X }
- X
- X if(zstrlen)
- X {
- X strncpy(param->pb + param->cb,zstr,zstrlen);
- X param->cb += zstrlen;
- X }
- X return(erc);
- X}
- X
- X/*+-------------------------------------------------------------------------
- X get_switches(param,switches,switches_max)
- X--------------------------------------------------------------------------*/
- Xint
- Xget_switches(param,switches,switches_max)
- XESD *param;
- Xchar *switches;
- Xint switches_max;
- X{
- Xregister itmp;
- Xregister index;
- Xregister char *pb = param->pb;
- Xint cb = param->cb;
- Xchar schar;
- X
- X *switches = 0;
- X
- X if(itmp = skip_cmd_break(param))
- X return(itmp);
- X
- X index = param->index;
- X if(*(param->pb + index) != '-')
- X return(eNoSwitches);
- X
- X switches_max--;
- X *switches++ = '-';
- X index++;
- X while((itmp < switches_max) && (index < cb))
- X {
- X schar = *(pb + index++);
- X if(isspace(schar))
- X break;
- X *switches++ = schar;
- X }
- X
- X param->index = index;
- X *switches = 0;
- X return(0);
- X
- X} /* end of get_switches() */
- X
- X/* vi: set tabstop=4 shiftwidth=4: */
- X/* end of esdutil.c */
- SHAR_EOF
- $TOUCH -am 1224223790 'esdutil.c' &&
- chmod 0644 esdutil.c ||
- echo 'restore of esdutil.c failed'
- Wc_c="`wc -c < 'esdutil.c'`"
- test 17780 -eq "$Wc_c" ||
- echo 'esdutil.c: original size 17780, current size' "$Wc_c"
- # ============= esiointf.c ==============
- echo 'x - extracting esiointf.c (Text)'
- sed 's/^X//' << 'SHAR_EOF' > 'esiointf.c' &&
- X/*+-------------------------------------------------------------------------
- X esiointf.c - esio/FAS interface
- X wht@n4hgf.Mt-Park.GA.US
- X
- X Defined functions:
- X pcmd_esio(param)
- X display_esio(sip)
- X icmd_esio(narg,arg)
- X ier_text(ier)
- X lcr_text(lcr)
- X mcr_text(mcr)
- X msr_text(msr)
- X
- X--------------------------------------------------------------------------*/
- X/*+:EDITS:*/
- X/*:12-24-1990-00:51-wht-creation */
- X
- X#if defined(ESIO_IN_USE)
- X#ifndef WHT
- X#define WHT
- X#endif
- X#include "ecu.h"
- X#include "ecuerror.h"
- X#include "esd.h"
- X#include <local/esio.h>
- X
- Xextern int proctrace;
- X
- X/*+-------------------------------------------------------------------------
- X msr_text(msr)
- X--------------------------------------------------------------------------*/
- Xchar *
- Xmsr_text(msr)
- Xuchar msr;
- X{
- Xstatic char txt[50];
- X
- X txt[0] = '*';
- X txt[1] = 0;
- X if(!msr)
- X {
- X strcat(txt,"NULL*");
- X return(txt);
- X }
- X if(msr & MS_CTS_DELTA) strcat(txt,"dCTS*");
- X if(msr & MS_DSR_DELTA) strcat(txt,"dDSR*");
- X if(msr & MS_RING_TEDGE) strcat(txt,"dRI*");
- X if(msr & MS_DCD_DELTA) strcat(txt,"dDCD*");
- X if(msr & MS_CTS_PRESENT) strcat(txt,"CTS*");
- X if(msr & MS_DSR_PRESENT) strcat(txt,"DSR*");
- X if(msr & MS_RING_PRESENT) strcat(txt,"RING*");
- X if(msr & MS_DCD_PRESENT) strcat(txt,"DCD*");
- X return(txt);
- X
- X} /* end of msr_text */
- X
- X/*+-------------------------------------------------------------------------
- X mcr_text(mcr)
- X--------------------------------------------------------------------------*/
- Xchar *
- Xmcr_text(mcr)
- Xuchar mcr;
- X{
- Xstatic char txt[32];
- X
- X txt[0] = '*';
- X txt[1] = 0;
- X if(!mcr)
- X {
- X strcat(txt,"NULL*");
- X return(txt);
- X }
- X if(mcr & MC_SET_DTR) strcat(txt,"DTR*");
- X if(mcr & MC_SET_RTS) strcat(txt,"RTS*");
- X if(mcr & MC_SET_OUT1) strcat(txt,"OUT1*");
- X if(mcr & MC_SET_OUT2) strcat(txt,"OUT2*");
- X if(mcr & MC_SET_LOOPBACK) strcat(txt,"LOOPBACK*");
- X return(txt);
- X
- X} /* end of mcr_text */
- X
- X/*+-------------------------------------------------------------------------
- X lcr_text(lcr)
- X--------------------------------------------------------------------------*/
- Xchar *
- Xlcr_text(lcr)
- Xuchar lcr;
- X{
- Xstatic char txt[64];
- X
- X sprintf(txt,"*%ddb*",(lcr & LC_WORDLEN_MASK) + 5);
- X strcat(txt,(lcr & LC_STOPBITS_LONG) ? "2" : "1");
- X strcat(txt,"sb*");
- X if(lcr & LC_ENABLE_PARITY)
- X {
- X strcat(txt,"PARITY*");
- X if(lcr & LC_STICK_PARITY)
- X strcat(txt,(lcr & LC_EVEN_PARITY) ? "MARK*" : "SPACE*");
- X else
- X strcat(txt,(lcr & LC_EVEN_PARITY) ? "EVEN*" : "ODD*" );
- X }
- X else
- X strcat(txt,"NOPAR*");
- X if(lcr & LC_SET_BREAK_LEVEL)
- X strcat(txt,"SETBREAK*");
- X if(lcr & LC_ENABLE_DIVISOR)
- X strcat(txt,"ENABDIV*");
- X return(txt);
- X
- X} /* end of lcr_text */
- X
- X/*+-------------------------------------------------------------------------
- X ier_text(ier)
- X--------------------------------------------------------------------------*/
- Xchar *
- Xier_text(ier)
- Xuchar ier;
- X{
- Xstatic char txt[32];
- X
- X txt[0] = '*';
- X txt[1] = 0;
- X if(!ier)
- X {
- X strcat(txt,"NULL*");
- X return(txt);
- X }
- X if(ier & IE_RECV_DATA_AVAILABLE) strcat(txt,"RDAV*");
- X if(ier & IE_XMIT_HOLDING_BUFFER_EMPTY) strcat(txt,"TBMT*");
- X if(ier & IE_LINE_STATUS) strcat(txt,"LS*");
- X if(ier & IE_MODEM_STATUS) strcat(txt,"MS*");
- X return(txt);
- X
- X} /* end of ier_text */
- X
- X/*+-------------------------------------------------------------------------
- X display_esio(sip)
- X--------------------------------------------------------------------------*/
- Xvoid
- Xdisplay_esio(sip)
- Xstruct esio_info *sip;
- X{
- X
- X pprintf("base address: %04x irq=%u ",sip->uart_port_0,sip->vec);
- X pputs("device is ");
- X if(sip->device_flags.s & DF_DEVICE_IS_NS16550)
- X pputs("16550\n");
- X else if(sip->device_flags.s & DF_DEVICE_IS_I82510)
- X pputs("82510\n");
- X else
- X pputs("16450\n");
- X pprintf("MSR=%s ",msr_text(sip->msr));
- X pprintf("MCR=%s\n",mcr_text(sip->mcr));
- X pprintf("LCR=%s ",lcr_text(sip->lcr));
- X pprintf("IER=%s\n",ier_text(sip->ier));
- X pprintf("recv ring cnt=%4d ",sip->recv_ring_cnt);
- X pprintf("xmit ring cnt=%4d\n",sip->xmit_ring_cnt);
- X pprintf("characters received =%8ld\n",sip->characters_received);
- X pprintf("characters transmited =%8ld\n",sip->characters_transmitted);
- X pprintf("modem status events =%8ld\n",sip->modem_status_events);
- X pprintf("total interrupt entries=%8ld\n",sip->total_interrupts);
- X pprintf("overrun errors=%ld ",sip->overrun_errors);
- X pprintf("framing errors=%ld ",sip->framing_errors);
- X pprintf("parity errors=%ld\n",sip->parity_errors);
- X pprintf("rings detected=%ld ",sip->rings_detected);
- X pprintf("breaks detected=%ld\n",sip->breaks_detected);
- X pprintf("xmtr flow off XON/XOFF=%ld RTS/CTS=%ld\n",
- X sip->xmtr_sw_flow_count,sip->xmtr_hw_flow_count);
- X pprintf("rcvr flow off XON/XOFF=%ld RTS/CTS=%ld\n",
- X sip->rcvr_sw_flow_count,sip->rcvr_hw_flow_count);
- X
- X} /* end of display_esio */
- X
- X/*+-------------------------------------------------------------------------
- X esio_msr() - return modem status register contents
- X--------------------------------------------------------------------------*/
- Xuchar
- Xesio_msr()
- X{
- Xulong ltmp;
- X
- X return((uchar)ioctl(shm->Liofd,FASIOC_MCR,(char *)<mp));
- X return(ltmp);
- X} /* end of esio_msr */
- X
- X/*+-------------------------------------------------------------------------
- X esio_line_errors() - return UART error count
- X--------------------------------------------------------------------------*/
- Xulong
- Xesio_line_errors()
- X{
- Xstruct esio_info sinfo,*sip = &sinfo;
- X
- X if((ioctl(shm->Liofd,FASIOC_SIP,(char *)sip)) < 0)
- X return(0);
- X return(sip->parity_errors + sip->framing_errors + sip->overrun_errors);
- X
- X} /* end of esio_line_errors */
- X
- X/*+-------------------------------------------------------------------------
- X esio_rings_detected() - return number of RI trailing edges
- X--------------------------------------------------------------------------*/
- Xulong
- Xesio_rings_detected()
- X{
- Xstruct esio_info sinfo,*sip = &sinfo;
- X
- X if((ioctl(shm->Liofd,FASIOC_SIP,(char *)sip)) < 0)
- X return(0);
- X return(sip->rings_detected);
- X
- X} /* end of esio_rings_detected */
- X
- X/*+-------------------------------------------------------------------------
- X esio_breaks_detected() - return number of BREAKs detected
- X--------------------------------------------------------------------------*/
- Xulong
- Xesio_breaks_detected()
- X{
- Xstruct esio_info sinfo,*sip = &sinfo;
- X
- X if((ioctl(shm->Liofd,FASIOC_SIP,(char *)sip)) < 0)
- X return(0);
- X return(sip->breaks_detected);
- X
- X} /* end of esio_breaks_detected */
- X
- X/*+-------------------------------------------------------------------------
- X pcmd_esio(param)
- Xesio [-switches] <str-cmd>>
- X
- Xwhere <str-cmd> is 'd[isplay]'
- X or 'r[eset]'
- X
- Xesio 'd'
- Xesio 'r'
- X--------------------------------------------------------------------------*/
- Xint
- Xpcmd_esio(param)
- XESD *param;
- X{
- Xint erc;
- Xchar switches[8];
- XESD *tesd = (ESD *)0;
- Xchar *cmd;
- Xstruct esio_info sinfo,*sip = &sinfo;
- X
- X get_switches(param,switches,sizeof(switches));
- X if(!(tesd = make_esd(64)))
- X return(eNoMemory);
- X if(!(erc = gstr(param,tesd,1)))
- X {
- X skip_cmd_break(tesd);
- X switch(to_lower(*(tesd->pb + tesd->index)))
- X {
- X case 'd': /* display */
- X if((ioctl(shm->Liofd,FASIOC_SIP,(char *)sip)) < 0)
- X {
- X pperror("ioctl FASIOC_SIP");
- X erc = eFATAL_ALREADY;
- X }
- X else
- X display_esio(sip);
- X break;
- X
- X case 'r': /* reset */
- X if((ioctl(shm->Liofd,FASIOC_RESET_STAT,(char *)0)) < 0)
- X {
- X pperror("ioctl FASIOC_RESET_STAT");
- X erc = eFATAL_ALREADY;
- X }
- X else if(proctrace)
- X pputs("statistics reset\n");
- X break;
- X
- X default:
- X pputs("invalid subcommand '");
- X pputs(tesd->pb);
- X pputs("'\n");
- X erc = eFATAL_ALREADY;
- X break;
- X }
- X }
- X
- X if(tesd)
- X free_esd(tesd);
- X return(erc);
- X
- X} /* end of pcmd_esio */
- X
- X/*+-------------------------------------------------------------------------
- X icmd_esio(narg,arg)
- X--------------------------------------------------------------------------*/
- Xvoid
- Xicmd_esio(narg,arg)
- Xint narg;
- Xchar **arg;
- X{
- Xstruct esio_info sinfo,*sip = &sinfo;
- X
- X if((narg > 1) && (to_lower(*arg[1]) == 'r'))
- X {
- X if((ioctl(shm->Liofd,FASIOC_RESET_STAT,(char *)0)) < 0)
- X {
- X pperror(" ioctl FASIOC_RESET_STAT");
- X return;
- X }
- X ff(se," esio statistics reset\r\n");
- X }
- X else
- X {
- X if((ioctl(shm->Liofd,FASIOC_SIP,(char *)sip)) < 0)
- X {
- X pperror(" ioctl FASIOC_SIP");
- X return;
- X }
- X ff(se,"\r\n");
- X display_esio(sip);
- X }
- X
- X} /* end of icmd_esio */
- X
- X#endif /* ESIO_IN_USE */
- X
- X/* vi: set tabstop=4 shiftwidth=4: */
- X/* end of esiointf.c */
- SHAR_EOF
- $TOUCH -am 1226024490 'esiointf.c' &&
- chmod 0644 esiointf.c ||
- echo 'restore of esiointf.c failed'
- Wc_c="`wc -c < 'esiointf.c'`"
- test 8287 -eq "$Wc_c" ||
- echo 'esiointf.c: original size 8287, current size' "$Wc_c"
- true || echo 'restore of expresp.c failed'
- echo End of part 10, continue with part 11
- exit 0
- --------------------------------------------------------------------
- Warren Tucker, TuckerWare emory!n4hgf!wht or wht@n4hgf.Mt-Park.GA.US
- Hacker Extraordinaire d' async PADs, pods, proteins and protocols
-
- exit 0 # Just in case...
- --
- Kent Landfield INTERNET: kent@sparky.IMD.Sterling.COM
- Sterling Software, IMD UUCP: uunet!sparky!kent
- Phone: (402) 291-8300 FAX: (402) 291-4362
- Please send comp.sources.misc-related mail to kent@uunet.uu.net.
-